package com.hxx.service.ai.impl;


import com.alibaba.fastjson.JSON;
import com.hxx.dto.OrderRequest;
import com.hxx.service.ai.HxxAiService;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.converter.BeanOutputConverter;
import org.springframework.ai.document.Document;
import org.springframework.ai.reader.tika.TikaDocumentReader;
import org.springframework.ai.transformer.splitter.TokenTextSplitter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Service;
import com.hxx.domain.Hxx;

import java.util.List;
import java.util.Map;

@Service
public class OpenAiHxxService implements HxxAiService {

    // 创建一个ChatClient实例，用于与OpenAI对话
    private ChatClient chatClient;

    // 使用构造函数注入ChatClient.Builder实例
    public OpenAiHxxService(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder
                .defaultOptions(ChatOptions.builder().build())
                .build();
    }

    // 定义系统提示词，包含菜品信息和期望的输出格式
    private final String SYSTEM_PROMPT = """
        你是一个售后助手，负责回复用户的需求信息。
        可用的回复列表如下：
        {dishes}
        
        
        结构化订单信息的格式为：
        {format}
        """;

    // 根据用户自然语言，解析订单信息
    @Override
    public void hxxOne(String naturalLanguageInput) {
        try {
            // 创建一个TikaDocumentReader实例，用于读取文件
            TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new FileSystemResource("d:/zmx/dish.txt"));
            // 使用TikaDocumentReader读取文件，并获取包含菜品信息的字符串
            List<Document> documents = new TokenTextSplitter().apply(tikaDocumentReader.read());
            // 将菜品信息转换为字符串
            String dishesInfo = documents.stream().map(Document::getContent).toList().toString();
            // 创建一个用于转换JSON到OrderRequest对象的转换器
            BeanOutputConverter<OrderRequest> beanOutputConverter = new BeanOutputConverter<>(OrderRequest.class);

            // 获取转换器的格式化字符串
            String format = beanOutputConverter.getFormat();

            // 创建提示词，包含系统信息、菜品信息和期望的输出格式
            PromptTemplate promptTemplate = new PromptTemplate(SYSTEM_PROMPT,
                    Map.of("dishes", dishesInfo,"format", format));

            // 发送到AI并获取响应
            String response = chatClient.prompt()
                    .system(promptTemplate.render())
                    .user(naturalLanguageInput)
                    .call()
                    .content();

            // 解析JSON响应
            OrderRequest responseMessage = beanOutputConverter.convert(response);
            System.out.println("---客户ai反馈信息---->>>"+responseMessage);
        } catch (Exception e) {
            // 如果发生异常，抛出运行时异常
            throw new RuntimeException("无法解析订单信息", e);
        }
    }
}
